package dal

import (
	"fmt"

	"public.com/Framework/dataSyncMgr/mysqlSync"
	//_ "github.com/go-sql-driver/mysql"

	"public.com/goutil/mysqlUtil"

	"7qule.com/sd3/CrossServer/src/common/onlinelog"
	"7qule.com/sd3/CrossServer/src/config"
	"github.com/jinzhu/gorm"
)

var (
	// 游戏模型数据库对象
	gameModelDB *gorm.DB

	// 游戏数据库
	gameDB *gorm.DB

	// 同步管理对象
	syncMgr *mysqlSync.SyncMgr

	// 同步文件大小
	syncFileSize = 1024 * 1024

	// 保留7天的sql文件
	fileMaxSaveTime = 24 * 7
)

func init() {
	// 初始化游戏模型数据库
	gameModelDBConfig := config.GetDbConfig().GetGameModelConfig()
	gameModelDB = initMysql(gameModelDBConfig)

	// 初始化crossSever 游戏数据库
	gameDBConfig := config.GetDbConfig().GetGameConfig()
	gameDB = initMysql(gameDBConfig)

	// 构造同步管理对象
	syncMgr = mysqlSync.NewSyncMgr(0, "Sync", syncFileSize, fileMaxSaveTime, gameDB.DB())
}

// 初始化Mysql
func initMysql(dbConfig *mysqlUtil.DBConfig) *gorm.DB {
	onlinelog.DebugLog("开始连接mysql:%s", dbConfig.ConnectionString)
	dbObj, err := gorm.Open("mysql", dbConfig.ConnectionString)
	if err != nil {
		panic(fmt.Errorf("初始化数据库:%s失败，错误信息为：%s", dbConfig.ConnectionString, err))
	}
	onlinelog.DebugLog("连接mysql:%s成功", dbConfig.ConnectionString)

	if dbConfig.MaxOpenConns > 0 && dbConfig.MaxIdleConns > 0 {
		dbObj.DB().SetMaxOpenConns(dbConfig.MaxOpenConns)
		dbObj.DB().SetMaxIdleConns(dbConfig.MaxIdleConns)
	}

	return dbObj
}

// 获取游戏数据库对象
// 返回值
// 游戏数据库对象
func GetGameDB() *gorm.DB {
	return gameDB
}

// 获取游戏模型数据库对象
// 返回值
// 游戏模型数据库对象
func GetGameModelDB() *gorm.DB {
	return gameModelDB
}

// 获取mysql的同步对象
func GetSyncMgr() *mysqlSync.SyncMgr {
	return syncMgr
}

// 读取数据表的所有数据
// dataList:用户保存数据的
func GetAll(dataList interface{}) error {
	mysqlObj := GetGameModelDB()
	if mysqlObj = mysqlObj.Find(dataList); mysqlObj.Error != nil {
		WriteLog("dal.GetAll", mysqlObj.Error)
		return mysqlObj.Error
	}

	return nil
}

// 读取游戏模型数据表的所有数据
// moduleName:模块名称
// dataList：用于保存数据的列表
func GetGameModelData(moduleName string, dataList interface{}) error {
	if result := gameModelDB.Find(dataList); result.Error != nil {
		WriteLog(moduleName+"GetGameModelData", result.Error)
		return result.Error
	}

	return nil
}

// 修改游戏模型数据表的数据
// moduleName:模块名称
// dataList：用于保存数据的列表
func UpdateGameModelData(moduleName string, dataList interface{}) error {
	gameModelDB.Update()
	if result := gameModelDB.Find(dataList); result.Error != nil {
		WriteLog(moduleName+"GetGameModelData", result.Error)
		return result.Error
	}

	return nil
}

// 记录错误日志
// command：执行的SQL语句
// err：错误对象
func WriteLog(command string, err error) {
	onlinelog.ErrorLog(fmt.Sprintf("Scan失败，错误信息：%s，command:%s", err, command))
}
